﻿using MySql.Data.MySqlClient;
using NewHPDNWcfService.Entities;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;

namespace NewHPDNWcfService.DAO
{
    /*
     Đây là lớp chính chứa các thao tác với CSDL
     * Các hoạt động như lấy thông tin bàn, hóa đơn, món... sẽ được thực hiện từ đây
     * Trình tự thực hiện như sau:
     * 1. Đọc Config trong DBConfig.cs
     * 2. Dùng DBHelperFactory để tạo 1 instance của lớp DBHelper này.
     * 3. Dùng DBHelper để truy cập CSDL
     */
    public class DBHelper
    {
        private MySqlConnection connection;
        string connectionString = DBConfig.stringConnection;

        public DBHelper()
        {
            connection = new MySqlConnection(connectionString);
        }

        public List<Table> getAllTables()
        {
            string query = "SELECT * FROM HappyTable ORDER BY name ASC";
            try
            {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader dataReader = cmd.ExecuteReader();
                List<Table> tables = new List<Table>();
                while (dataReader.Read())
                {
                    Table tb = new Table();
                    tb.Id = (int)dataReader["Id"];
                    tb.TableName = (string)dataReader["Name"];
                    tb.Capability = (int)dataReader["Capability"];
                    tb.Status = (int)dataReader["Status"];
                    tables.Add(tb);
                }
                connection.Close();
                return tables;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Get all tables: Loi cmnr: " + ex.Message + "\n" + ex.StackTrace);
                return null;
            }

        }

        public Table getTableById(int id)
        {
            Table tb = null;
            string query = string.Format("SELECT * FROM HappyTable Where id={0}", id);
            try
            {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader dataReader = cmd.ExecuteReader();
                tb = new Table();
                if (dataReader.Read())
                {
                    tb.Id = (int)dataReader["id"];
                    tb.TableName = (string)dataReader["Name"];
                    tb.Capability = (int)dataReader["Capability"];
                    tb.Status = (int)dataReader["Status"];
                }
                connection.Close();
                return tb;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Get table by id: Loi cmnr: " + ex.Message + "\n" + ex.StackTrace);
                return null;
            }

        } // End get table by id


        public void TestInsertDate() 
        {
            DateTime today = DateTime.Now;
            string mysqlDateString = today.ToString("yyyy-MM-dd HH:mm:ss");

            string query = string.Format("Insert into testdate value('{0}')", mysqlDateString);

            try
            {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(query, connection);
                cmd.ExecuteNonQuery();
                connection.Close();
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public Bill GetTableCurrentBill(Table table)
        {
            if (table == null)
	        {
		        Debug.WriteLine("GetTableCurrentBill: Table parameter is NULL");
                return null;
	        }
            Debug.WriteLine("GetTableCurrentBill: id=" + table.Id +  " name="+table.TableName);
            int tableId = table.Id;
            int billId = 0;
            Bill bill = null;
            string query = string.Format("Select * from table_bill where TableId='{0}'", tableId);

            try
            {
                connection.Open();

                // First, we get the bill id
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    billId = (int)reader["bill"];
                }
                connection.Close();


                // Then we will get the actual bill, base on the bill id 
                // we've just acquired.
                query = string.Format("Select * from Bill where Id='{0}'", billId);

                // Assign new instance to old references, just re-use the names

                connection.Open();
                cmd = new MySqlCommand(query, connection);
                reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    bill = new Bill();
                    bill.Id = (int)reader["Id"];
                    bill.TableId = (int) reader["TableId"];
                    bill.Casher = new User((int)reader["Casher"]);
                    bill.Waitress = new User((int)reader["Waitress"]);
                    bill.Time = (DateTime)reader["Time"];
                    bill.Total = (double) reader["Total"];
                }

                // Close connection to mysql when done.
                connection.Close();
                return bill;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Get current bill: " + ex.Message + "\n" + ex.StackTrace);
                return null;
            }

            return null;
        }


        // Get all detail for a bill
        public List<BillDetails> GetBillDetails(Bill bill)
        {

            string query = string.Format("Select * from BillDetails where BillId='{0}'", bill.Id);
            List<BillDetails> details = new List<BillDetails>();
            Debug.WriteLine("GetBillDetails: " +query);
            try
            {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader reader = cmd.ExecuteReader();
                
                while (reader.Read())
                {
                    BillDetails bd = new BillDetails();
                    bd.BillId = (int) reader["BillId"];
                    /*
                     * Ở đây cần 1 trick nho nhỏ, vì chúng ta chỉ có
                     * một instance để truy vấn CSDL, nên không thể vừa đọc BillDetails
                     * và vừa đọc để lấy Item của BillDetail đó.
                     * Nên chúng ta sẽ ghi lại Id của item và sau khi có tất cả các detail,
                     * chúng ta sẽ quay lại lấy Item và điền thông tin thật của item vào detail.
                     */ 
                    bd.Item = new Item((int) reader["ItemId"]);
                    bd.Count = (int)reader["Count"];
                    bd.Price = (double) reader["Price"];

                    details.Add(bd);
                }
                // Close connection to mysql when done.
                connection.Close();


                // Lấy các item
                foreach (var detail in details)   // var name with and without s
                {
                    int itemId = detail.Item.Id;
                    detail.Item = this.GetItemById(itemId);
                    Debug.WriteLine("Adding: " +detail.Item.Name);
                }

                return details;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Get bill detail ERROR: " + ex.Message +"\n" +ex.StackTrace);
            }
            return null;
        }


        public Item GetItemById(int itemId)
        {
            Item item = null;
            string query = string.Format("Select * from Item where id='{0}'", itemId);
            try
            {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    item = new Item();
                    item.Id = itemId;
                    item.Name = (string)reader["Name"];
                    item.Unit = (string)reader["Unit"];
                    item.Price = (double)reader["Price"];
                    item.CategoryId = (int)reader["Category"];
                }
                connection.Close();

            }
            catch (Exception ex)
            {
                Debug.WriteLine("Get item by id ERROR: " + ex.Message + "\n" + ex.StackTrace);
            }

            return item;
        }


        public void TablePay(Table table)
        {

            if (table.Status == 0)
            {   // Table is free, there is nothing to pay
                Debug.WriteLine("Table pay: Status = 0");
            }
            else
            {
                /* Khi 1 bàn cần thanh toán, chúng ta sẽ thực hiện các công việc sau:
                 * 1. Tìm hóa đơn theo bàn đó
                 * 2. Tìm tất cả các chi tiết của hóa đơn đó
                 * 3. Tính thành tiền = số lượng x đơn giá cho từng detail
                 * 4. Cộng tiền theo tất cả các chi tiết trong hóa đơn.
                 * 5. Lưu Tông tiền (Total) của hóa đơn đó vào CSDL
                 * 6. Chuyển trạng thái của bàn sang free.
                 * 7. Chuyển bill hiện tại của bàn thành -1 (trong bảng table_bill)
                 * */
                Bill bill = GetTableCurrentBill(table);
                List<BillDetails> details = GetBillDetails(bill);
                foreach (var detail in details)
                {
                    Debug.WriteLine("Bill: " + bill.Id + " Item: " +detail.Item.Id +" Price: " +detail.Item.Price
                        );
                    bill.Total += detail.Item.Price * detail.Count;
                }

                // Test
                Debug.WriteLine("Bill số "+bill.Id +" Tổng tiền: " +bill.Total);

                // Update tổng tiền
                UpdateBill(bill);

                // Free that table
                try
                {
                    string query = string.Format("Update HappyTable set Status=0 where id = '{0}'", table.Id);
                    connection.Open();
                    MySqlCommand cmd = new MySqlCommand(query, connection);
                    cmd.ExecuteNonQuery();
                    connection.Close();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Table pay ERROR: " + ex.Message + "+\n" + ex.StackTrace);
                }


                // Turn current bill to -1
                try
                {
                    string query = string.Format("Update table_bill set bill=-1 where TableId = '{0}'", table.Id);
                    connection.Open();
                    MySqlCommand cmd = new MySqlCommand(query, connection);
                    cmd.ExecuteNonQuery();
                    connection.Close();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Table pay ERROR: " + ex.Message + "+\n" + ex.StackTrace);
                }
            }
        }




        public void UpdateBill(Bill bill)
        {
            if (bill == null)
            {
                Debug.WriteLine("UpdateBill ERROR: Bill parameter is null");
            }
            else
            {
                int billId = bill.Id;
                string query = string.Format("Update Bill set Total='{0}' Where id='{1}'", bill.Total, bill.Id);

                try
                {
                    connection.Open();
                    MySqlCommand cmd = new MySqlCommand(query, connection);
                    cmd.ExecuteNonQuery();
                    connection.Close();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("UpdateBill ERROR: "+ex.Message + "+\n" +ex.StackTrace);
                }
            }
        }




        // Thêm món cho 1 bàn nào đó
        /*
         * Table: bàn cần gọi thêm
         * Item: món ăn khách muốn gọi thêm
         * mCount: số lượng gọi thêm
         * 
         * */
        public void MoreDish(Table table, Item item, int mCount)
        {
            if (table.Status == 0)
            {
                // Nếu bàn đang free thì không có thêm món,
                // mà phải là gọi món
                // Hoặc có thể cải tiến thành : nếu bàn đang trống thì tạo 
                // 1 bill mới cho bàn đó, chuyển thành bàn đang có khách.
                // TODO: Biến giấc mơ thành sự thật
                // Thôi được, gọi món và thêm món là như cmn nhau
                Debug.WriteLine("MoreDish Error: table " +table.Id+ " is free now.");
                return;
            }

            // Lấy Bill của bàn hiện tại
            Bill bill = GetTableCurrentBill(table);
            if (bill == null)
            {
                // Check cho chắc
                Debug.WriteLine("MoreDish ERROR: table " + table.Id + " has no bill assosiated with.");
            }
            else
            { 
                /* Trong bill vừa lấy được, tìm xem đã có item nào trùng với item vừa gọi thêm không
                 * Nếu chưa có, tạo thêm 1 BillDetail để lưu item đó 
                 * Nếu đã có rồi, cộng thêm số lượng cho detail đó
                 * */
                List<BillDetails> details = GetBillDetails(bill);

                // Trường hợp đã có
                if (IsItemInList(item, details))
                {
                    // Ta tìm đến dòng chi tiết hóa đơn tương ứng với món hiện tại
                    // và tiến hành cập nhật
                    foreach (var detail in details)
                    {
                        // Đúng dòng cần cập nhật
                        if (detail.Item.Id == item.Id)
                        {
                            Debug.WriteLine("We are adding MORE");
                            // Tăng số lượng trong chi tiết hóa đơn lên
                            detail.Count += mCount;
                            // Cập nhật ngay và luôn vào CSDL
                            UpdateBillDetail(detail);
                            // Thoat luon khoi vong for
                            break;
                        }
                        else
                        {
                            // Không phải món đó thì tiếp tục duyệt trong list các 
                            // dòng chi tiết hóa đơn cho đến khi tìm thấy
                        }
                        
                    }
                    
                }
                /* 
                 * Trường hợp Khách gọi 1 món mới, chưa có trong hóa đơn của họ,
                 * Cần tạo 1 dòng chi tiết hóa đơn mới
                */
                else
                {
                    Debug.WriteLine("We gonna add a NEW BillDetail");
                    int billId = bill.Id;
                    int itemId = item.Id;
                    double price = item.Price;
                    string query = string.Format(                                   // 1 = Đã phục vụ
                        "Insert into BillDetails values (null, '{0}', '{1}', '{2}','{3}','1')", 
                        billId, itemId, mCount, price);
                    Debug.WriteLine("MoreDish: query: " + query);
                    try
                    {
                        connection.Open();
                        MySqlCommand cmd = new MySqlCommand(query, connection);
                        cmd.ExecuteNonQuery();
                        connection.Close();
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine("MoreDish inserting new detail FAILED: "+ex.Message + "+\n" +ex.StackTrace);
                    }
                }
                
                
                // Tính lại tổng tiền và update cho bill này

                // Phải lấy lại bill của bàn hiện tại vì vừa xong có thể có 
                // cái chết mịa gì đó được thêm vào
                bill = GetTableCurrentBill(table);
                bill.Total = 0;
                details = GetBillDetails(bill);
                Debug.WriteLine("MoreDish: Tinh lai tong tien:");
                foreach (var detail2 in details)
                {
                    Debug.WriteLine(string.Format("MoreDish: Dang tinh: billId = {0}, ItemId = {1}",bill.Id, detail2.Item.Id));
                    bill.Total += detail2.Item.Price * detail2.Count;
                }
                Debug.WriteLine("MoreDish: Update tong tien: " + bill.Total);
                UpdateBill(bill);

            }
        } // End method


        // A helper method 
        /*
         * Tìm xem một item nào đó có trong 1 list hay không,
         * nhằm giúp cho việc thêm 1 món vào 1 hóa đơn, phải tìm xem
         * món đó đã có trong hóa đơn chưa, để từ đó quyết định
         * tạo 1 chi tiết hóa đơn mới hay chỉ cộng thêm số lượng vào 
         * chi tiết hóa đơn cũ
         */
        private bool IsItemInList(Item item, List<BillDetails> details)
        {
            foreach (var detail in details)
            {
                if (detail.Item.Id == item.Id)
                {
                    return true;
                }    
            }

            return false;
        }


        public void UpdateBillDetail(BillDetails detail)
        {
            // Lại check phát
            if (detail == null)
            {
                Debug.WriteLine("UpdateBillDetail: ERRRRRRRRRRRRROR: BillDetail is null");
                return;
            }

            // Chỉ update số lượng cho chi tiết hóa đơn thôi
            // Cái khác thì kệ cmn đi
            string query = string.Format("Update billdetails set count='{0}' where BillId='{1}' AND ItemId='{2}'", 
                detail.Count, detail.BillId, detail.Item.Id);
            Debug.WriteLine("UpdateBillDetail: " +query);
            try
            {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(query, connection);
                cmd.ExecuteNonQuery();
                connection.Close();
            }
            catch (Exception ex)
            {
                Debug.WriteLine("UpdateBillDetail ERROR: "+ex.Message + "+\n" +ex.StackTrace);
            }
        }



        public List<Category> GetAllCategories()
        {
            string query = string.Format("Select * from Category Order by Name ASC");
            
            try
            {
                connection.Open();

                List<Category> categories = new List<Category>();
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader dataReader = cmd.ExecuteReader();
                while (dataReader.Read())
                {
                    Category c = new Category();
                    c.Id = (int) dataReader["Id"];
                    c.Name = (string)dataReader["Name"];
                    categories.Add(c);
                }

                connection.Close();
                return categories;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("GetAllCategory ERROR: " + ex.Message + "+\n" + ex.StackTrace);
            }
            return null;
        } // end getAllCategories

        // Lấy danh sách các món đang chờ của 1 bàn
        public List<BillDetails> GetWaiting(Table table)
        {
            Debug.WriteLine("DBHelper.GetWaiting: table: id = " +table.Id);
            // Lấy hóa đơn của bàn đang làm việc
            Bill bill = GetTableCurrentBill(table);

            // This if...else... is for debug purpose
            if (bill == null)
            {
                Debug.WriteLine("Could not get a bill for this table");
            }
            else
            {
                Debug.WriteLine("Bill Id for this table: " + bill.Id);
            }

            List<BillDetails> waitings = new List<BillDetails>();
            string query = string.Format("Select * from billdetails where BillId='{0}' And Status='0'", bill.Id);
            try
            {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    BillDetails bd = new BillDetails();
                    bd.BillId = (int)reader["BillId"];
                    /*
                     * Ở đây cần 1 trick nho nhỏ, vì chúng ta chỉ có
                     * một instance để truy vấn CSDL, nên không thể vừa đọc BillDetails
                     * và vừa đọc để lấy Item của BillDetail đó.
                     * Nên chúng ta sẽ ghi lại Id của item và sau khi có tất cả các detail,
                     * chúng ta sẽ quay lại lấy Item và điền thông tin thật của item vào detail.
                     */
                    bd.Item = new Item((int)reader["ItemId"]);
                    Debug.WriteLine("Adding Item " +bd.Item);
                    bd.Count = (int)reader["Count"];
                    bd.Price = (double)reader["Price"];

                    waitings.Add(bd);
                }
                // Close connection to mysql when done.
                connection.Close();


                // Lấy các item
                foreach (var detail in waitings)   // var name with and without s
                {
                    int itemId = detail.Item.Id;
                    detail.Item = this.GetItemById(itemId);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Get waitings: "+ ex.Message +"\n"+ex.StackTrace);
            }
            Debug.WriteLine("We will return a "+waitings.Count +" elements list");
            return waitings;
        } // 


        // Lấy danh sách chi tiết hóa đơn đã phục vụ cho 1 bàn
        public List<BillDetails> GetDone(Table table)
        {
            Debug.WriteLine("DBHelper.GetDone: table: id = " + table.Id);
            // Lấy hóa đơn của bàn đang làm việc
            Bill bill = GetTableCurrentBill(table);

            // This if...else... is for debug purpose
            if (bill == null)
            {
                Debug.WriteLine("Could not get a bill for this table");
            }
            else
            {
                Debug.WriteLine("Bill Id for this table: " + bill.Id);
            }

            List<BillDetails> done = new List<BillDetails>();
            string query = string.Format("Select * from billdetails where BillId='{0}' And Status='1'", bill.Id);
            try
            {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    BillDetails bd = new BillDetails();
                    bd.BillId = (int)reader["BillId"];
                    /*
                     * Ở đây cần 1 trick nho nhỏ, vì chúng ta chỉ có
                     * một instance để truy vấn CSDL, nên không thể vừa đọc BillDetails
                     * và vừa đọc để lấy Item của BillDetail đó.
                     * Nên chúng ta sẽ ghi lại Id của item và sau khi có tất cả các detail,
                     * chúng ta sẽ quay lại lấy Item và điền thông tin thật của item vào detail.
                     */
                    bd.Item = new Item((int)reader["ItemId"]);
                    Debug.WriteLine("Adding Item " + bd.Item);
                    bd.Count = (int)reader["Count"];
                    bd.Price = (double)reader["Price"];

                    done.Add(bd);
                }
                // Close connection to mysql when done.
                connection.Close();


                // Lấy các item
                foreach (var detail in done)   // var name with and without s
                {
                    int itemId = detail.Item.Id;
                    detail.Item = this.GetItemById(itemId);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Get waitings: " + ex.Message + "\n" + ex.StackTrace);
            }
            Debug.WriteLine("We will return a " + done.Count + " elements list");
            return done;
        } //

        /*
         * Lấy ra tât cả các Items trong 1 category
         */
        public List<Item> GetItemsByCategory(Category c)
        {
            List<Item> itemsList = new List<Item>();
            string query = string.Format("Select * from Item where Category='{0}' order by name asc", c.Id);
            try {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    Item item = new Item();
                    item.Id = (int)reader["Id"];
                    item.Name = (string) reader["Name"];
                    item.Unit = (string)reader["Unit"];
                    item.CategoryId = (int) reader["Category"];
                    item.Price = (double) reader["Price"];
                    itemsList.Add(item);
                }
                // Close connection to mysql when done.
                connection.Close();

            }
            catch (Exception ex)
            {
                Debug.WriteLine("GetItemsByCategory: " + ex.Message + "\n" + ex.StackTrace);
            }
            return itemsList;
        } // End GetItemsByCategory


        // Gọi món
        public void GoiMon(Table table, Item item, int count)
        { 
            // Xem xem bàn trống hay không
            // Nếu là bàn trống thì chuyển thành busy
            // và tạo 1 hóa đơn mới cho bàn đó
            // Link bàn với hóa đơn

            // Lấy table trong CSDL ra dùng cho chuẩn
            Debug.WriteLine("Table id: " +table.Id);
            table = getTableById(table.Id);

            // Bill cho khách của bàn này
            Bill bill = null;
            // Nếu bàn trống
            if (table.Status == 0)
            {
             // Chuyển trạng thái sang bận
                table.Status = 1;
                // Lưu luôn trạng thái vào CSDL cho chắc ăn
                string query = string.Format("Update happytable set Status='1' where Id='{0}'", table.Id);
                Debug.WriteLine(query);
                try
                {
                    connection.Open();
                    MySqlCommand cmd = new MySqlCommand(query, connection);
                    cmd.ExecuteNonQuery();
                    connection.Close();
                }
                catch (Exception ex)
                {
                    // Không hiểu sao, tối nay ngồi code mà cứ thấy
                    // miên man
                    Debug.WriteLine("GoiMon: Đổi trạng thái bàn: " + ex.Message +"\n" + ex.StackTrace);
                }

             // Tạo một hóa đơn mới cho bàn này
                /* Trước hết tôi sẽ lấy Id cho bill này bằng cách 
                 * tìm ra số bill (BillId) lớn nhất hiện tại trong CSDL
                 * và tăng nó lên 1.
                 * BillId là trường AUTO_INCREMENT, nhưng lát nữa tôi cần sử dụng
                 * đến nó, thế nên tôi sẽ tự tính toán cho trường này.
                 */
                int billId = 0;
                try
                {
                    string qMaxId = string.Format("Select Max(Id) as MaxId from Bill");
                    connection.Open();
                    MySqlCommand cmd = new MySqlCommand(qMaxId, connection);
                    MySqlDataReader reader = cmd.ExecuteReader();
                    
                    if (reader.Read())
                    {
                        billId = (int) reader["MaxId"];
                    }
                    // Tăng id lên 1 vì id của bill tiếp theo sẽ
                    // bằng id max hiện tại + 1
                    billId++;
                    
                    Debug.WriteLine("New Bill ID: " + billId);
                    connection.Close();
                }
                catch (Exception ex)
                {
                    
                    Debug.WriteLine("GoiMon: Lấy Max BillId: " + ex.Message + "\n" + ex.StackTrace);
                }
                bill = new Bill();
                bill.Id = billId;
                bill.TableId = table.Id;
                bill.Waitress = new User(2); // Fix cứng vậy đã
                bill.Casher = new User(1); // Cái này cũng thế, chắc chả có thời gian
                                 // và kinh phí để sửa cái này
                bill.Total = 0;
                //string mysqlDateString = now.ToString("yyyy-MM-dd HH:mm:ss");
                bill.Time = DateTime.Now;

             // Lại cho vào CSDL
                string q = string.Format("INSERT INTO Bill values('{0}','{1}','{2}','{3}','{4}','{5}')", 
                    billId,
                    table.Id, bill.Casher.Id, bill.Waitress.Id,
                    bill.Total, bill.Time.ToString("yyyy-MM-dd HH:mm:ss"));
                Debug.WriteLine(q);
                try
                {
                    connection.Open();
                    MySqlCommand cmd = new MySqlCommand(q, connection);
                    cmd.ExecuteNonQuery();
                    connection.Close();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("GoiMon: Tạo hóa đơn: " + ex.Message + "\n" + ex.StackTrace);
                }

             // Liên kết bill vừa tạo với bàn đang làm việc
                string linkStr = string.Format("Update table_bill set Bill='{0}' Where TableId='{1}'",
                     billId, table.Id);
                Debug.WriteLine(linkStr);
                try
                {
                    connection.Open();
                    MySqlCommand cmd = new MySqlCommand(linkStr, connection);
                    cmd.ExecuteNonQuery();
                    connection.Close();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("GoiMon: Linking: " + ex.Message + "\n" + ex.StackTrace);
                }
            } // Hết các công việc cần xử lý nếu bàn trống.

            // Nếu bàn là bàn đang có khách, cần phải tìm Bill của bàn đó 
            // cho khách hiện tại
            else
            {
                bill = GetTableCurrentBill(table);
            }


            /* Bây giờ là tạo chi tiết hóa đơn
             * Dù bàn trống hay không thì cũng sẽ
             * phải làm các công việc sau
             */

            // Tạo chi tiết hóa đơn và để Status = 0 : Đang đợi
            BillDetails bd = new BillDetails();
            bd.BillId = bill.Id;
            bd.Item = item;
            bd.Price = item.Price;
            bd.Count = count;
            bd.Status = 0;

            // Lưu chi tiết hóa đơn này vào CSDL
            string newBdStr = string.Format("Insert into BillDetails values(null,'{0}','{1}','{2}','{3}','{4}')",
                bd.BillId, bd.Item.Id, bd.Count, bd.Price, bd.Status);
            Debug.WriteLine(newBdStr);
            try
            {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(newBdStr, connection);
                cmd.ExecuteNonQuery();
                connection.Close();
            }
            catch (Exception ex)
            {
                Debug.WriteLine("GoiMon: New bill detail: " + ex.Message + "\n" + ex.StackTrace);
            }
        }

        /*
        public Item GetItemById(int id)
        {
            Item item = null;
            string q = string.Format("Select * from item where id='{0}'", id);
            try
            {
                connection.Open();
                MySqlCommand cmd = new MySqlCommand(q, connection);
                MySqlDataReader reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    item = new Item();
                    item.Id = (int)reader["Id"];
                    item.Name = (string)reader["Name"];
                    item.CategoryId = (int)reader["Category"];
                    item.Price = (double)reader["Price"];
                }
                connection.Close();
            }
            catch (Exception ex)
            {
                Debug.Write("GetItemById ERROR: " +ex.Message + "\n" + ex.StackTrace);
            }
            return item;
        }
         */
    }

    
}